using System;
using SunflowSharp.Image;

namespace SunflowSharp.Core
{

    /**
     * Represents an image output device.
     */
    public interface IDisplay
    {
        /**
         * This is called before an image is rendered to indicate how large the
         * rendered image will be. This allows the display driver to write out image
         * headers or allocate surfaces. Bucket size will be 0 when called from a
         * non-bucket based source.
         * 
         * @param w width of the rendered image in pixels
         * @param h height of the rendered image in pixels
         * @param bucketSize size of the buckets in pixels
         */
        void imageBegin(int w, int h, int bucketSize);

        /**
         * Prepare the specified area to be rendered. This may be used to highlight
         * the work in progress area or simply to setup the display driver to
         * receive the specified portion of the image
         * 
         * @param x x coordinate of the bucket within the image
         * @param y y coordinate of the bucket within the image
         * @param w width of the bucket in pixels
         * @param h height of the bucket in pixels
         * @param id unique identifier corresponding to the thread which invoked
         *            this call
         */
        void imagePrepare(int x, int y, int w, int h, int id);

        /**
         * Update the current image with a bucket of data. The region is guarenteed
         * to be within the bounds created by the call to imageBegin. No clipping is
         * necessary. Colors are passed in unprocessed. It is up the display driver
         * to do any type of quantization, gamma compensation or tone-mapping
         * needed. The array of colors will be exactly <code>w * h</code> long and
         * in row major order.
         * 
         * @param x x coordinate of the bucket within the image
         * @param y y coordinate of the bucket within the image
         * @param w width of the bucket in pixels
         * @param h height of the bucket in pixels
         * @param data bucket data, this array will be exactly <code>w * h</code>
         *            long
         */
        void imageUpdate(int x, int y, int w, int h, Color[] data);

        /**
         * Update the current image with a region of flat color. This is used by
         * progressive rendering to render progressively smaller regions of the
         * screen which will overlap. The region is guarenteed to be within the
         * bounds created by the call to imageBegin. No clipping is necessary.
         * Colors are passed in unprocessed. It is up the display driver to do any
         * type of quantization , gamma compensation or tone-mapping needed.
         * 
         * @param x x coordinate of the region within the image
         * @param y y coordinate of the region within the image
         * @param w with of the region in pixels
         * @param h height of the region in pixels
         * @param c color to fill the region with
         */
        void imageFill(int x, int y, int w, int h, Color c);

        /**
         * This call is made after the image has been rendered. This allows the
         * display driver to close any open files, write the image to disk or flush
         * any other type of buffers.
         */
        void imageEnd();
    }
}